home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok56 / m2maker / txt / inputhandler.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  123 lines

  1. (*---------------------------------------------------------------------------
  2.   :Program.    m2Maker
  3.   :Author.     Thomas Stolze
  4.   :Address.    Goslarsche Str. 32, 3000 Hannover 21, Germany
  5.   :Phone.      (0)511 / 75 10 77
  6.   :Version.    V2.0
  7.   :Date.       13-Nov-90
  8.   :Copyright.  Shareware
  9.   :Language.   Modula-2
  10.   :Translator. M2Amiga V3.32d
  11.   :Contents.   Programming Utility.
  12.   :Remark.     Supports the M2Amiga System (C) by A+L AG Switzerland
  13. ---------------------------------------------------------------------------*)
  14.  
  15. IMPLEMENTATION MODULE InputHandler;
  16.  
  17. IMPORT ExecD;
  18. IMPORT R;
  19.  
  20. FROM Arts          IMPORT Assert;
  21. FROM ExecD         IMPORT Interrupt,IOStdReq,IOStdReqPtr,MsgPortPtr;
  22. FROM ExecL         IMPORT CloseDevice,DoIO,Forbid,
  23.                           OpenDevice,Permit,PutMsg;
  24. FROM ExecSupport   IMPORT CreateExtIO,CreatePort,DeleteExtIO,DeletePort;
  25. FROM Input         IMPORT addHandler,inputName,remHandler;
  26. FROM InputEvent    IMPORT InputEvent,Class,InputEventPtr,Qualifiers,
  27.                           QualifierSet;
  28. FROM InitIntuition IMPORT InputMessage,prgPtr;
  29. FROM IntuitionD    IMPORT IDCMPFlags,IDCMPFlagSet,IntuiMessage,WindowPtr;
  30. FROM IntuitionL    IMPORT ActivateWindow;
  31. FROM SYSTEM        IMPORT ADDRESS,ADR,LONGSET;
  32.  
  33. VAR ioPort,
  34.     replyPort : MsgPortPtr;
  35.     intrpt    : Interrupt;
  36.     inMsg     : InputMessage;
  37.     ioReq     : IOStdReqPtr;
  38.  
  39. (*$LoadA4:=TRUE*)
  40. PROCEDURE Handler(eventptr{R.A0} : InputEventPtr): InputEventPtr;
  41. BEGIN
  42.  IF rawkey = eventptr^.class THEN
  43.     IF (control IN eventptr^.qualifier) AND
  44.        (lShift  IN eventptr^.qualifier) THEN
  45.  
  46.        CASE eventptr^.code OF
  47.          40H,50H..59H:
  48.  
  49.          WITH inMsg.event DO
  50.             code:=eventptr^.code;
  51.             class:=IDCMPFlagSet{rawKey};
  52.             qualifier:=eventptr^.qualifier;
  53.             iAddress:=NIL;
  54.             seconds:=eventptr^.timeStamp.secs;
  55.             micros:=eventptr^.timeStamp.micro;
  56.             idcmpWindow:=prgPtr^.window;
  57.             specialLink:=NIL;
  58.          END;
  59.  
  60.          inMsg.news.node.type:=ExecD.message;
  61.          inMsg.news.length:=SIZE(IntuiMessage);
  62.          inMsg.news.replyPort:=replyPort;
  63.  
  64.          ActivateWindow(prgPtr^.window);
  65.          PutMsg(prgPtr^.window^.userPort,ADR(inMsg));
  66.          eventptr:=eventptr^.nextEvent;
  67.        ELSE
  68.        END;
  69.     END;
  70.  END;
  71.  RETURN eventptr;
  72. END Handler;
  73.  
  74. PROCEDURE InstallHandler;
  75. BEGIN
  76.   intrpt.data:=NIL;
  77.   intrpt.code:=ADR(Handler);
  78.   intrpt.node.pri:=52;
  79.  
  80.   ioReq^.data:=ADR(intrpt);
  81.   ioReq^.command:=addHandler;
  82.   ioReq^.length:=SIZE(InputEvent);
  83.  
  84.   DoIO(ioReq);
  85.     Assert(ioReq^.error = 0,ADR("I/O Fehler"));
  86.  
  87. END InstallHandler;
  88.  
  89. PROCEDURE CauseInput(command : CARDINAL; len : LONGCARD; adr : ADDRESS);
  90. BEGIN
  91.   ioReq^.command:=command;
  92.   ioReq^.length:=len;
  93.   ioReq^.data:=adr;
  94.   DoIO(ioReq);
  95.     Assert(ioReq^.error = 0,ADR("I/O Fehler"));
  96. END CauseInput;
  97.  
  98. PROCEDURE Guard;
  99. BEGIN
  100.   ioPort:=CreatePort(NIL,0);
  101.     Assert(ioPort # NIL,ADR("MsgPort not allocated"));
  102.   replyPort:=CreatePort(NIL,0);
  103.     Assert(replyPort # NIL,ADR("MsgPort not allocated"));
  104.   ioReq:=CreateExtIO(ioPort,SIZE(IOStdReq));
  105.     Assert(ioReq # NIL,ADR("IOStdReq not allocated"));
  106.  
  107.   OpenDevice(ADR(inputName),0,ioReq,LONGSET{});
  108.  
  109.   InstallHandler;
  110. END Guard;
  111.  
  112. BEGIN
  113.  
  114. CLOSE
  115.   IF (intrpt.code # NIL) THEN
  116.      CauseInput(remHandler,0,ADR(intrpt)); CloseDevice(ioReq);
  117.   END;
  118.   IF (ioReq     # NIL) THEN DeleteExtIO(ioReq);    ioReq:=NIL;       END;
  119.   IF (ioPort    # NIL) THEN DeletePort(ioPort);    ioPort:=NIL;      END;
  120.   IF (replyPort # NIL) THEN DeletePort(replyPort); replyPort:=NIL;   END;
  121.  
  122. END InputHandler.
  123.